#pragma comment(linker, "/STACK:102400000,102400000") 
#pragma GCC optimize("O3")
#pragma GCC diagnostic error "-std=c++11"
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
typedef long long ll;
ll G(ll a, ll b) {
	ll ans=a/b;
	while (b*ans+ans-1>a) {
		ans--;
	}
	if (ans<0) ans=0;
	return ans;
}
int main() {
	ll n,k,a;
	ll ask_n;
	while (cin>>n>>k>>a) {
		cin>>ask_n;
		ll* ask=new ll[ask_n];
		for (int i=0; i<ask_n; ++i) {
			cin>>ask[i];
		}
		multiset<ll> ss;
		ll cnt=G(n,a);
		ss.insert(0ll); ss.insert(n+1);
		ll ans;
		bool flag=false;
		for (int i=0; i<ask_n; ++i) {
			ss.insert(ask[i]);
			multiset<ll>::iterator it=ss.lower_bound(ask[i]);
			ll pre=*(--it);
			ll now=*(++it);
			ll nex=*(++it);
//			cout<<"---"<<pre<<" "<<now<<" "<<nex<<endl;
			cnt+=G(now-pre-1,a)+G(nex-now-1,a)-G(nex-pre-1,a);
			if (cnt<k) {
				ans=i+1;
				flag=true;
				break;
			}
		}
		if (flag) cout<<ans<<endl;
		else cout<<-1<<endl;
		delete [] ask;
	} 
	return 0;
}
